外观
2024年12月 GESP C++ 三级真题解析
一、单选题(每题2分,共30分)
选择题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | B | D | A | A | D | B | C | A | A | D | D | C | D | C | A |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 下列二进制表示的十进制数值分别是()
[10000011]原 =( ) [10000011]补 =( )
A. -125,-3
B. -3,-125
C. -3,-3
D. -125,-125
查看解析
答案:B
考纲知识点: 原码、补码转换
解析:
原码 10000011 → -3;补码 10000011 → -125。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 关于计算机中的编码,下列说法中错误的是()
A. 对于无符号数,原码就是真值
B. 正数的反码是其本身
C. 负数的反码和补码是不一样的
D. 负数的反码,在其原码的基础上,各个位取反
查看解析
答案:D
考纲知识点: 编码基础
解析:
D 描述正确,故“错误”选 D。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 16进制数B2025转换成8进制数是()
A. 2620045
B. 2004526
C. 729125
D. 2420045
查看解析
答案:A
考纲知识点: 进制转换
解析:
B2025₁₆ → 2620045₈。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 625.625变成二进制是()
A. 1001110001.101
B. 101.101
C. 101.1001110001
D. 1001110001.1101
查看解析
答案:A
考纲知识点: 小数二进制
解析:
625 → 1001110001;0.625 → 0.101,组合得 A。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 下面逻辑运算中,正确的是()
A. 5 & 8 & 3 == 6
B. 5 | 3 == 8
C. 5 | 3 == 1
D. 5 & 8 & 3 == 0
查看解析
答案:D
考纲知识点: 位运算
解析:
5&8&3=0,正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 补码1111 1101右移1位得到的结果是()
A. 1111 1100
B. -2
C. 1111 1101
D. 1111 1010
查看解析
答案:B
考纲知识点: 补码右移
解析:
1111 1101 → -3;右移1位得 -2。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 下列代码输出的是()
cpp
string s = "1234@@chenadai";
string str = "12345";
s.replace(1,5,str);
cout<<s<<endl;1
2
3
4
2
3
4
A. 12345
B. 2345@
C. 112345chenadai
D. 12345chenadai
查看解析
答案:C
考纲知识点: string::replace
解析:
从索引 1 开始替换 5 个字符,原串变为 1 + "12345" + "chenadai",即 112345chenadai。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. a|10(a与10均为10进制,且二进制表示最高位为1)运算的结果是()
A. 使a的二进制表示从右往左的第二位为1
B. 使a的二进制表示从右往左的第一位为0
C. 使a的二进制表示从右往左第二位为0
D. 使a的二进制表示最高位为0
查看解析
答案:A
考纲知识点: 位运算
解析:
10 的二进制为 1010,与 a 或运算可将第二位(从右往左数)置1。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 下列程序输出的是()
cpp
string ch="hello";
if(ch[5] == NULL){
cout<<"right"<<endl;
}else if (ch[5] == '\0'){
cout<<"wrong"<<endl;
}else{
cout<<"hello"<<endl;
}1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
A. right
B. wrong
C. hello
D. 不能正确执行
查看解析
答案:A
考纲知识点: 字符串结束符
解析:"hello" 长度为 5,索引 5 处为 '\0',NULL 与 '\0' 等价,故输出 right。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 下列程序中,假设一个字符占用的内存空间是 1,则 ch 占用的内存空间是()
cpp
char ch[] = "hello world";
size_t ret = strlen(ch);
cout << ret << endl;1
2
3
2
3
A. 11
B. 10
C. 13
D. 12
查看解析
答案:D
考纲知识点: strlen 与数组长度
解析:"hello world" 11 个可见字符 + 1 个结束符 '\0' = 12 字节。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限11. 下列程序最后输出的是()
cpp
int a = 65;
cout << tolower(a) << endl;1
2
2
A. 65
B. A
C. a
D. 97
查看解析
答案:D
考纲知识点: 字符大小写转换
解析:tolower(65) 返回 97('a' 的 ASCII)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限12. 想要计算从数字 n 到数字 m 之间(包含 n 和 m)有多少个数字 d 出现,下列程序哪个能够实现()
选项 A:
cpp
int n,m,res,d;
cin >> n >> m >> d;
for(int i = n + 1; i <= m; i++){
int temp = i;
while(temp){
if(temp % 10 == d) res++;
temp /= 10;
}
}
cout << res << endl;1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
选项 B:
cpp
int n,m,res,d;
cin >> n >> m >> d;
for(int i = n; i <= m; i++){
int temp = i;
while(temp){
if(temp % 10 == d) res++;
temp /= 10;
}
}
cout << res << endl;1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
选项 C:
cpp
int n,m,res=0,d;
cin >> n >> m >> d;
for(int i = n; i <= m; i++){
int temp = i;
while(temp){
if(temp % 10 == d) res++;
temp /= 10;
}
}
cout << res << endl;1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
选项 D:
cpp
int n,m,res=0,d;
cin >> n >> m >> d;
for(int i = n; i <= m; i++){
while(temp){
if(temp % 10 == d) res++;
temp /= 10;
}
}
cout << res << endl;1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
查看解析
答案:C
考纲知识点: 循环与数字处理
解析:
选项 C 完整包含 i 从 n 到 m,且 temp 每次初始化为 i,符合题意。其余选项存在范围错误或变量未初始化问题。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限13. 兔子五元一只,鸡三元一只,小鸭子一元三只,用 100 元买 100 只,下列程序能实现的是()
选项 A:
cpp
for(int i = 0; i <= 100; i++){
for(int j = 0; j <= 100; j++){
for(int k = 0; k <= 100; k++){
if(i + j + k == 100 && 5 * i + 3 * j + k / 3 == 100 && k % 3 == 0){
cout << i << " " << j << " " << k << endl;
}
}
}
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
选项 B:
cpp
for(int i = 0; i <= 100; i++){
for(int j = 0; j <= 100; j++){
for(int k = 0; k <= 300; k++){
if(i + j + k == 100 && 5 * i + 3 * j + k / 3 == 100 && k % 3 == 0){
cout << i << " " << j << " " << k << endl;
}
}
}
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
选项 C:
cpp
for(int i = 0; i <= 20; i++){
for(int j = 0; j <= 34; j++){
for(int k = 0; k <= 20; k++){
if(i + j + k == 100 && 5 * i + 3 * j + k == 300 && k % 3 == 0){
cout << i << " " << j << " " << k << endl;
}
}
}
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
选项 D:
cpp
for(int i = 0; i <= 100; i++){
for(int j = 0; j <= 100; j++){
for(int k = 0; k <= 100; k++){
if(i + j + k == 100 && 5 * i + 3 * j + k == 300){
cout << i << " " << j << " " << k << endl;
}
}
}
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
查看解析
答案:B
考纲知识点: 枚举算法
解析:
兔子 + 鸡 + 鸭子 = 100 只;
5i + 3j + k/3 = 100 元;
鸭子 k 必须是 3 的倍数,范围 0–300。
选项 B 枚举范围正确,且条件完整。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限14. 求小于等于 N 的素数的方法中,下列程序体现了“试除法”的是()
选项 A:
cpp
if(N >= 3){
cout << 2 << endl;
for(int i = 2; i <= N; i++){
int flag = 0;
for(int j = 2; j < i; j++){
if(i % j != 0){
flag = 1;
}
}
if(flag == 0){
cout << i << endl;
}
flag = 0;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
选项 B:
cpp
if(N >= 2){
for(int i = 3; i <= N; i++){
int flag = 0;
for(int j = 2; j < i; j++){
if(i % j == 0){
flag = 1;
}
}
if(flag == 0){
cout << i << endl;
}
flag = 0;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
选项 C:
cpp
if(N >= 2){
cout << 2 << endl;
for(int i = 3; i <= N; i++){
int flag = 0;
for(int j = 2; j < i; j++){
if(i % j == 0){
flag = 1;
break;
}
}
if(flag == 0){
cout << i << endl;
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
选项 D:
cpp
if(N >= 2){
cout << 2 << endl;
for(int i = 3; i <= N; i++){
int flag = 0;
for(int j = 2; j < i; j++){
if(i % j == 0){
flag = 1;
}
}
if(flag == 0){
cout << i << endl;
}
flag = 0;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
查看解析
答案:C
考纲知识点: 试除法求素数
解析:
选项 C 从 3 开始枚举每个 i,用 2~i-1 逐一试除;一旦发现能整除立即 break,符合“试除法”的定义。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限15. 工人工作一天得 1 金环,15 天需 15 环,最少需剪成几段()
选项 A:
4 段,分别是 1、2、4、81
选项 B:
15 段,每段 1 个1
选项 C:
6 段,分别是 3、3、3、3、2、11
选项 D:
9 段,分别是 2、2、2、2、2、2、1、1、11
查看解析
答案:A
考纲知识点: 组合数学 / 二进制拆分
解析:
1, 2, 4, 8 可组合出 1~15 任意整数,满足“每天结算”需求,且段数最少。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限二、判断题(每题2分,共20分)
判断题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | √ | √ | √ | × | √ | √ | × | √ | √ | √ |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 为了简化计算机基本运算电路,使加减法都只需要通过加法电路实现,也就是让减去一个正数或加上一个负数这样的运算可以用加上一个正数来代替。于是改变负数存储的形式,存储成一种可以直接当成正数来相加的形式,这种形式就是补码。()
查看解析
答案:√
考纲知识点: 补码定义
解析:
补码设计初衷是简化电路设计,通过补码,计算机可以统一处理加法和减法。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 使用原码进行的计算,2 + (-1) 的结果是 -3。()
查看解析
答案:√
考纲知识点: 原码运算
解析:
原码直接表示数值,2 + (-1) 原码 = 2 + 1111 = 1101 = -3。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 反码计算加减法:加法与减法结果都是正确的,只是解决不了 -0 的问题。()
查看解析
答案:√
考纲知识点: 反码运算
解析:
反码适用于无符号数,有符号数需使用补码。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 10 进制数 63,在转换成二进制的计算过程中,产生了如下的式子:
63 / 2 = 31 余 1
31 / 2 = 15 余 1
15 / 2 = 7 余 1
7 / 2 = 3 余 1
3 / 2 = 1 余 1
1 / 2 = 0 余 11
2
3
4
5
6
2
3
4
5
6
按照从前往后的顺序,获得 63 的二进制值是 111111。()
查看解析
答案:×
考纲知识点: 进制转换
解析:
63 转换为二进制结果的确为 111111,但是应该按照从后往前的顺序去整理。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 下列程序输出的是 A()
cpp
char x = 65;
x = x & 00001111;
cout << x << endl;1
2
3
2
3
查看解析
答案:√
考纲知识点: 位运算
解析:
65 的二进制表示为 0100 0001。
代码中的 00001111 实际上是八进制数,等价于十进制 585,对应的二进制为 10 0100 1001。
执行按位与运算:0100 0001 & 10 0100 1001 =00 0100 0001,即十进制 65,转化为ASCII码,即字母 'A'。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 下列可执行程序段中,最后 pos 的值是 4()
cpp
string str = "chenADai";
int pos = str.find('D');
--pos & 11;1
2
3
2
3
查看解析
答案:√
考纲知识点: 字符串查找
解析:find 返回 5,-- 后为 4,& 11 无影响。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. string ch="chen"; cout << ch[4] << endl; 该段程序将不能正确执行。()
查看解析
答案:×
考纲知识点: 字符串索引
解析:
索引 4 超出范围,但未越界访问,程序可执行。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. char a = 'A'; a = a + 32; cout << (int)a << endl; 将输出 97。()
查看解析
答案:√
考纲知识点: 字符与整数转换
解析:
'A' + 32 = 65,类型转换后输出 97。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 自然界中,最小的素数是 2。()
查看解析
答案:√
考纲知识点: 素数定义
解析:
2 是最小的素数,正确。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. CCF(十六进制)= 12363(七进制)。()
查看解析
答案:√
考纲知识点: 进制转换
解析:
十六进制 CCF 转换十进制为 3279,然后3279转为七进制为 12363。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限三、编程题(每题25分,共50分)
1. 数字替换
题目描述
小杨有一个包含 n 个数字的序列 A,即 A = {a₁, a₂, …, aₙ},他想将其中大于 k 的数字都替换为序列的最大值,将其中小于 k 的数字都替换为序列的最小值,请你帮他计算出替换后的序列。
输入格式
第一行包含两个正整数 n, k,含义如题面所示。
第二行包含 n 个数字,代表序列 A。
输出格式
输出 n 个整数,代表替换后的结果。
数据范围
1 ≤ n ≤ 10⁵,|k|, |aᵢ| ≤ 10⁵
样例输入
5 2
-2 -1 0 1 21
2
2
样例输出
-2 -2 2 2 21
解题思路
查看解题思路
- 先找出整个数组的最大值和最小值。
- 遍历数组:
- 大于 k → 改成最大值
- 小于 k → 改成最小值
- 等于 k → 不变
- 顺序输出即可。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int a[100010];
int main(){
int n,k;
cin >> n >> k;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
int max_value = a[1], min_value = a[1];
for(int i = 1; i <= n; i++){
max_value = max(max_value, a[i]);
min_value = min(min_value, a[i]);
}
for(int i = 1; i <= n; i++){
if(a[i] > k) a[i] = max_value;
else if(a[i] < k) a[i] = min_value;
}
for(int i = 1; i <= n; i++){
if(i == n) cout << a[i] << endl;
else cout << a[i] << " ";
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 打印数字
题目描述
⼩杨为数字0,1,2和3设计了⼀款表⽰形式,每个数字占⽤了
tex
..... ****. ..... .....
.***. ****. ****. ****.
.***. ****. ..... .....
.***. ****. .**** ****.
..... ****. ..... .....1
2
3
4
5
2
3
4
5
⼩杨想请你将给定的数字n转换为对应的表⽰形式。
输入格式
一行一个正整数 n(0 ≤ n ≤ 10⁶),仅含数字 0,1,2,3。
输出格式
输出对应的表示形式。
样例输入
122301
样例输出
****.....................
****.****.****.****..***.
****.................***.
****..****.********..***.
****.....................1
2
3
4
5
2
3
4
5
解题思路
查看解题思路
考纲知识点: 字符串处理与循环输出
简化题意:
把一串只含 0、1、2、3 的数字,按 5×5 的“贴纸”图案,并排打印成 5 行网格。
样例解释:
- 样例1:输入 "12230",输出 5 行,每行由 5 格×5 格组成,行之间用换行、数字之间用空格分隔。
解题思路:
- 预先把 0~3 的 5 行“贴纸”存成二维数组。
- 从第 0 行到第 4 行循环:
- 先把当前行的所有数字对应贴纸连起来。
- 每张贴纸后面加空格。
- 一行打印完后换行,共打印 5 行即可。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string n;
cin >> n;
for (int row = 0; row < 5; row++) {
string line = "";
for (char digit : n) {
if (digit == '0') {
if (row == 0 || row == 4) {
line += ".....";
} else {
line += ".***.";
}
} else if (digit == '1') {
line += "****.";
} else if (digit == '2') {
if (row == 0) {
line += ".....";
} else if (row == 1) {
line += "****.";
} else if (row == 2) {
line += ".....";
} else if (row == 3) {
line += ".****";
} else {
line += ".....";
}
} else if (digit == '3') {
if (row == 0) {
line += ".....";
} else if (row == 1) {
line += "****.";
} else if (row == 2) {
line += ".....";
} else if (row == 3) {
line += "****.";
} else {
line += ".....";
}
}
}
cout << line << endl;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限